using System;
using System.Collections.Generic;

using PMServiceDesk.DataAccess;
using PMServiceDesk.DataType;
using PMServiceDesk.Parameters.Constantes;

namespace PMServiceDesk.BusinessLogic
{
    public class RecursoLogic
    {
        #region Variables

        private RecursoData _recursoData;

        #endregion

        #region Constructores

        public RecursoLogic()
        {
            _recursoData = new RecursoData();
        }

        #endregion

        #region Metodos

        public RecursoType CargarPorId(string id)
        {
            _recursoData.FiltrarPorId(id);

            return _recursoData.Cargar();
        }

        public RecursoType CargarPorRecursoProyecto(string proyectoId,string tipoDocumentoIdentidadId,string documentoIdentidad)
        {
            _recursoData.FiltrarPorProyectoId(proyectoId);
            _recursoData.FiltrarPorTipoDocumentoIdentidad(tipoDocumentoIdentidadId);
            _recursoData.FiltrarPorDocumentoIdentidad(documentoIdentidad);

            return _recursoData.Cargar();
        }

        public void Grabar(RecursoType recurso)
        {
            _recursoData.Grabar(recurso);
        }

        public void RegistrarRecursoJefeProyecto(ProyectoType proyecto)
        {
            //Registro el Recurso
            UsuarioLogic logicUsuario = new UsuarioLogic();

            UsuarioType usuario = logicUsuario.CargarPorId(proyecto.UsuarioJefeProyectoId);

            ParametroLogic logicParametro = new ParametroLogic();

            ParametroType tipoRecurso = logicParametro.CargarPorId(Parametros.TipoRecurso_Humano);

            RecursoLogic logicRecurso = new RecursoLogic();

            RecursoType recurso = logicRecurso.CargarPorRecursoProyecto(proyecto.Id, usuario.TipoDocumentoIdentidadId, usuario.DocumentoIdentidad);

            if (recurso == null) 
            {
                recurso = new RecursoType();

                recurso.Nombre = usuario.Nombre;
                recurso.ProyectoId = proyecto.Id;
                recurso.CalendarioId = proyecto.CalendarioId;
                recurso.TipoDocumentoIdentidadId = usuario.TipoDocumentoIdentidadId;
                recurso.DocumentoIdentidad = usuario.DocumentoIdentidad;
                recurso.Costo = 0;
            }

            recurso.Abreviatura = Parametros.Abreviatura_JefeProyecto;
            recurso.TipoRecursoId = tipoRecurso.Id;
            recurso.TipoCostoId = tipoRecurso.ParametroReferenciaId;
            recurso.CalendarioId = proyecto.CalendarioId;
            recurso.EstadoId = Estados.Recurso_Vigente;

            logicRecurso.Grabar(recurso);

            //Registro el Rol
            RolLogic logicRol = new RolLogic();

            RolType rolJP = logicRol.CargarPorNombreProyecto(proyecto.Id, Parametros.Rol_JefeProyecto);

            if (rolJP == null)
            {
                rolJP = new RolType();

                rolJP.ProyectoId = proyecto.Id;
                rolJP.Nombre = Parametros.Rol_JefeProyecto;
            }

            rolJP.Habilitado = true;

            logicRol.Grabar(rolJP);

            //Registro el Usuario Recurso
            UsuarioRecursoLogic logicUsuarioRecurso = new UsuarioRecursoLogic();

            UsuarioRecursoType usuarioRecurso = logicUsuarioRecurso.CargarPorUsuarioRecurso(usuario.Id,recurso.Id);

            if (usuarioRecurso == null)
            {
                usuarioRecurso = new UsuarioRecursoType();

                usuarioRecurso.UsuarioId = usuario.Id;
                usuarioRecurso.RecursoId = recurso.Id;
            }

            usuarioRecurso.RolId = rolJP.Id;

            logicUsuarioRecurso.Grabar(usuarioRecurso);
        }

        public List<RecursoType> CargarExplorador(string proyectoId)
        {
            if(proyectoId != "") _recursoData.FiltrarPorProyectoId(proyectoId);

            return _recursoData.CargarListaVista();
        }

        public List<RecursoType> CargarExploradorPaginado(RecursoType registroBusqueda, int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _recursoData.FiltrarPorProyectoId(registroBusqueda.ProyectoId);
            if (registroBusqueda.EstadoId != "") _recursoData.FiltrarPorEstadoId(registroBusqueda.EstadoId);
            if (registroBusqueda.TipoRecursoId != "") _recursoData.FiltrarPorTipoRecurso(registroBusqueda.TipoRecursoId);
            if (registroBusqueda.CalendarioId != "") _recursoData.FiltrarPorCalendario(registroBusqueda.CalendarioId);
            if (registroBusqueda.DocumentoIdentidad != "") _recursoData.FiltrarPorDocumentoIdentidad(registroBusqueda.DocumentoIdentidad);
            if (registroBusqueda.Abreviatura != "") _recursoData.FiltrarPorNombre(registroBusqueda.Abreviatura);
            if (registroBusqueda.Nombre != "") _recursoData.FiltrarPorNombre(registroBusqueda.Nombre);

            return _recursoData.CargarListaVista(paginaActual, cantidadMostrar, orderBy);
        }

        public List<RecursoType> CargarRecursosVigentesPorProyecto(string proyectoId)
        {
            _recursoData.FiltrarPorProyectoId(proyectoId);
            _recursoData.FiltrarPorEstadoId(Estados.Recurso_Vigente);

            return _recursoData.CargarLista();
        }

        #endregion
    }
}
